const gulp = require('gulp')
const path = require('path')
const browserSync = require('browser-sync')

// 动态加载其他的插件
const $ = require('gulp-load-plugins')({
  // 只加载开发依赖
  scope: ['devDependencies'],
  pattern: '*'
})

// 项目根目录
const baseDir = path.join(__dirname, '..');
// 项目最终打包后的目录
const buildFolderRelative = '../build';
const buildFolder = path.join(buildFolderRelative);

// 关于资源的打包任务
const imgres = require('./image-resources')
imgres.gulptasksImageResources($, gulp, buildFolder)

// 关于音频的
const sounds = require('./sounds')
sounds.gulptasksSounds($, gulp, buildFolder)

// upload
const upload = require('./upload')
upload.gulptasksUpload($, gulp, buildFolder)

// 关于js的
const js = require('./js')
js.gulptasksJS($, gulp, buildFolder, browserSync)

// 关于css的
const css = require('./css')
css.gulptastsCSS($, gulp, buildFolder, browserSync)

// 关于html的
const html = require('./html')
html.gulptasksHTML($, gulp, buildFolder, browserSync)

// 清除所有的文件
gulp.task('utils.cleanup', () => {
  // read 不读取文件，allowEmpty 可以为空
  return gulp.src(buildFolder, { read: false, allowEmpty: true }).pipe($.clean({ force: true }))
})

gulp.task('utils.copyAdditionalBuildFiles', cb => {

})

function serve({ standalone }){
  // 启动一个服务
  browserSync.init({
    server: buildFolder,
    port: 3005,
    ui: false,
    // 不同步所有的设备
    ghostMode: {
      clicks: false,
      scroll: false,
      location: false,
      forms: false
    },
    logLevel: 'info',
    logPrefix: "BS",
    // 是否联网
    online: false,
    // 是否联网服务
    xip: false,
    // 不显示通知
    notify: false,
    // 刷新的频率
    reloadDebounce: 100,
    // 是否同步刷新所有浏览器
    reloadOnRestart: true,
    watchEvents: ['add', 'change']
  })

  // watch .scss files
  gulp.watch(['../src/**/*.scss'], gulp.series(['css.dev']))

  // watch .html files
  gulp.watch("../src/**/*.html", gulp.series([standalone ? 'html.standalone-dev' : 'html.dev']))

  // watch sound files
  gulp.watch(
    ['../res_raw/sounds/ui/*.mp3', '../res_raw/sounds/ui/*.wav'],
    gulp.series('sounds.encodeUi', 'sounds.copy')
  )
  gulp.watch(
    ['../res_raw/sounds/game/*.mp3', '../res_raw/sounds/game/*.wav'],
    gulp.series('sounds.encodeGame', 'sounds.copy')
  )
  gulp.watch(
    ['../res_raw/sounds/music/*.mp3', '../res_raw/sounds/music/*.wav'],
    gulp.series('sounds.encodeMusic', 'sounds.copy')
  )
  
  // watch version file
  gulp.watch('../version.txt', gulp.series(['uploadGameVersion']));

  // watch resource files
  gulp.watch(imgres.nonImageResourcesGlobs, gulp.series(['imgres.copyNonImageResources']));
  gulp.watch(imgres.imageResourcesGlobs, gulp.series(['imgres.copyImageResources']))

  // watch the build folder and reload then anything changed
  const extensions = ['html', 'js', 'png', 'jpg', 'svg', 'mp3', 'ico', 'woff2']
  // 因为gulp.watch只接受相对路径
  gulp.watch(extensions.map(ext => buildFolderRelative + '/**/*.' + ext)).on('change', path => {
    // 当browserSync可以通过流加载给页面修改就这样修改，不行就刷新页面
    return gulp.src(path).pipe(browserSync.reload({ stream: true }))
  })

  gulp.series("js.dev.watch")(() => true);
}

// Builder everything
gulp.task('build.dev', gulp.series(
  // 删除文件
  'utils.cleanup',
  // 'utils.copyAdditionalBuildFiles',
  // 音频文件转码打包
  'sounds.dev',
  // 游戏图片打包
  'imgres.copyImageResources',
  // 游戏视频字体打包
  'imgres.copyNonImageResources',
  // js打包
  'js.dev',
  // css打包
  'css.dev',
  // html打包
  'html.dev',
  'configChangeToBuild',
  'uploadGameVersion'
))

// Builder everything prod
gulp.task('build.prod', gulp.series(
  // 删除文件
  'utils.cleanup',
  // 'utils.copyAdditionalBuildFiles',
  // 音频文件转码打包
  'sounds.dev',
  // 游戏图片打包
  'imgres.copyImageResources',
  // 游戏视频字体打包
  'imgres.copyNonImageResources',
  // js打包
  'js.prod',
  // css打包
  'css.prod',
  // html打包
  'html.prod',
  "configChangeToBuild",
  'uploadGameVersion'
))
gulp.task('build.prod.app', gulp.series(
  // 删除文件
  'utils.cleanup',
  // 'utils.copyAdditionalBuildFiles',
  // 音频文件转码打包
  'sounds.dev',
  // 游戏图片打包
  'imgres.copyImageResources',
  // 游戏视频字体打包
  'imgres.copyNonImageResources',
  // js打包
  'js.prod.app',
  // css打包
  'css.prod',
  // html打包
  'html.prod',
  "configChangeToBuild",
  'uploadGameVersion'
))

gulp.task('main.serveDev', gulp.series('build.dev', () => serve({ standalone: false })))

gulp.task("default", gulp.series("main.serveDev"));

gulp.task('upload.server', gulp.series('uploadGameVersion', 'deleteServerFolder', 'uploadServer'))

gulp.task("upload", gulp.series(
  'uploadServerWgt', 
  'uploadServerApk',
  'upload.server'
));
